iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 15
0

Pete, Moore, Fields 等人依照前天 Cash 給的 Docker 快速入門,依樣畫葫蘆,大家發現幾個問題,是必須注意的:

  1. 由於大家都擁有 docker 群組權限,每個人都可以藉由 docker exec -t -i CONTAINER_NAME bash 連上已經啟動的 container,一個不小心可能會誤操作別人啟動容器。
  2. 如果有用 -v 將home目錄對應給 Container,其他具有docker權限的人,就能操作home。門戶大開。
  3. 要啟動自己的 container 之前,必須避開別人已經佔用的 port,也不能使用相同命名
  4. 在 container 不小心下 exit 或是關掉終端機軟體,等同 stop container,可以下 docker start -i CONTAINER_NAME 啟動它後連結到TTY
  5. 另外他們也觀察到只要不下 docker rm DOCKER_NAME,就算其所在的Server關機再重啟後,再次下 docker start -i CONTAINER_NAME 先前安裝與設定都還在。

Gavin 訝異 docker 似乎沒有安全機制,Cash 解釋 docker 基本上不是 VM,在生產環境下,會搭配其他的機制管理,我們還處在做練習階段,先不理會安全機制。

大家討論了一下,port 大家就依之前協議 分配 port,命名在後面加上自己的英文名子,例如 Pete 要啟動 Mxnet

docker run -t -i --runtime=nvidia \
   -p 8588:8888 -p 6506:6006 \  #協議Pete用85xx Port,但是docker內部可維持Jupyter 8888 
   --name=mxnet_pete \  #命名加 『_NAME』
   -v ~:/media \
   -v /etc/localtime:/etc/localtime:ro \
   -v /etc/timezone:/etc/timezone:ro \
   --workdir /media  \
   mxnet/python:1.3.0_gpu_cu92_py3 \
   bash

對了忘記講為何有兩個 port 需要暴露給外面呢?那是因為 Jupyter 預設用8888;而許多機器學習(例如 mxnet)長達幾天甚至術週訓練過程的,會採用 Tensorflow 提供的 Tensorboard來呈現進展。而Tensorboard預設的 port 是 6006。我們假設都不改變預設 port,要避開衝突是由 -p 這個參數來進行。

如果要建立新的 image,其後標籤就採用英文名,例如:

docker commit mxnet_pete mxnet:pete

這樣幾個人共用 Server 的 GPU 就可以避免衝突。


另外在docker因為是相當精簡的Linux,會遇到一些便利性的問題,Cash 請大家嘗試連上自己的docker container後,如同連到 Ubuntu Server 做一些設定

docker start -i mxnet_pete
apt update
apt install nano #預設 docker container沒有vi, nano 等編輯軟體, 所以必須安裝
nano .bash_aliases #可參考 https://ithelp.ithome.com.tw/articles/10203114

alias py36='source activate py36'
alias py27='source activate py27'
alias deactivate='source deactivate'

另外 Pete 馬上想到,如果自己辛苦設定好的 image 是否可以給其他Server 的同事用, Cash 請大家連到 hub.docker.com ,如果沒有機密的問題,可以考慮先註冊一個帳號,比方說是tsoftpete,然後

export DOCKER_ID_USER="tsoftpete” #後續在 docker hub 是以 tsoftpete 帳號進行, 可加進 .bashrc
docker login
docker tag IMAGE_NAME $DOCKER_ID_USER/IMAGE_NAME
docker push $DOCKER_ID_USER/IMAGE_NAME #要上傳數百MB, 甚或數GB

這樣全世界都可以拉下來使用。

docker pull tsoftpete/IMAGE_NAME #或者用下方指令直接啟動
docker run -t -i … … tsoftpete/IMAGE_NAME bash

如果Image裡內含有機密問題,可以採用一些商業方案,我們以後有用到再談。

另外也可考慮採用

docker export CONTAINER_NAME > CONTAINER_NAME.tar

拿到其他機器後導入

docker import CONTAINER_NAME.tar
docker images #查看新導入的 image id
docker tag IMAGE_ID NEW_IMAGE_NAME:TAG #給予新的 image 名稱

以上的指令都可以在官網查到細節。


Fields 說他觀察到許多在github上公開的框架都有看到 Dockerfile , 感覺很像 Conda 的 environment 檔案,都是用來製作一個新的開發環境。Cash 也覺得這對要製作給團隊一個標準環境來講,藉由編寫一個 Dockerfile 再發布給其他人,是很有效率的作法,不過要講解其內部指令要花一點時間,等大家對 docker 使用熟練後再詳談會比較有幫助。

備註:

專案緣起記錄在 【UP, Scrum 與 AI專案】


上一篇
山寨 GPU 顯示卡
下一篇
由 Linear Regression 看機器學習演算法-mini-batch stochastic gradient descent
系列文
深度學習所需入門知識--一位初學者的認知31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言